perm filename PRED0.FAI[SYS,HE] blob
sn#009294 filedate 1972-12-06 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00015 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00003 00002 TITLE VIEWER - IMAGE FORMING SUBROUTINES - JULY 1972.
00004 00003 PROJECTOR(CAMERA,WORLD).
00006 00004 PROJECTOR(CAMERA,WORLD) CONTINUED.
00007 00005 UNPROJECT(V)
00009 00006 FACOEF(B,FLG).
00012 00007 ZCLIPF(F0)
00014 00008 FMARK(WORLD) - MARK POTENT FACES FOR OCCULT.
00016 00009 EMARK(WORLD) - MARK POTENT EDGES FOR OCCULT.
00018 00010 EMARKALL(WORLD) - MARK ALL EDGES POTENT.
00019 00011 VMARK(OWINDO,WORLD) - MARK THE NSEW BIT OF ALL THE VERTICES.
00021 00012 SUBR ZCLIP(V1,U,V2).
00023 00013 XY-CLIPPER, SKIPS WHEN PORTION IS VISIBLE.
00025 00014 XY-CLIPPER continued.
00027 00015 CNT,,"nbody" ELIST ← CLIPER(OWINDO,WORLD)
00030 ENDMK
⊗;
TITLE VIEWER - IMAGE FORMING SUBROUTINES - JULY 1972.
COMMENT /
IMAGE FORMING OPERATIONS;
MKLOCOR;
SIEVE(CAMERA,WORLD)
PROJECTOR(CAMERA,WORLD)
FMARK(WORLD)
EMARK(WORLD)
U ← ZCLIP(V1,U,V2)
XYCLIP
ECNT,,ELIST ← CLIPER(DPY,OWINDO,WORLD)
/
EXTERN GETBLK,RELBLK
EXTERN MKB,MKF,MKE,MKV,MKBFV
EXTERN KLB,KLF,KLE,KLV
EXTERN NCW.,PCW.,NCCW.,PCCW.
EXTERN ECW,ECW.,ECCW,ECCW.,OTHER,OTHER.
EXTERN BODY,FCW,FCCW,VCW,VCCW
DECLARE{XL,XH,YL,YH}
DECLARE{FOCAL,LDX,LDY,LDZ}
DECLARE{SCALEX,SCALEY,SCALEZ}
DECLARE{SOX,SOY,MAGX,MAGY}
DECLARE{CAMLOCOR}
;PROJECTOR(CAMERA,WORLD).
;DO THE PERSPECTIVE PROJECTION.
SUBR(PROJECTOR)
BEGIN PROJECTOR
ACCUMULATORS{B,F,E,V,C,E0,X,XX,Y,YY,Z,ZZ}
;AD HOC CLEAR THE PZZ,,NZZ BITS.
LAC B,ARG1
I0: PBODY B,B↔TESTZ B,BBIT↔GO[LAC F,B
I1: PFACE F,F↔TEST F,FBIT↔GO I0↔MARKZ F,PZZ∨NZZ↔GO I1]
;GET CAMERA SCALES AND FOCAL.
LAC C,ARG2
LAC 7(C)↔DAC SCALEX
LAC 8(C)↔DAC SCALEY
LAC 9(C)↔DAC SCALEZ
LAC 6(C)↔DAC FOCAL
LAC 1(C)↔DAC LDX
LAC 2(C)↔DAC LDY
LAC 3(C)↔DAC LDZ
;GET THE CAMERA'S LOCOR.
LAC C,ARG2↔LOCOR C,C↔DAC C,CAMLOCOR
DAC 12,S12#↔DAC 16,S16#
;FOREACH B|BεWORLD DO
LAC B,ARG1
L1: PBODY B,B
TEST B,BBIT↔GO[LAC 12,S12↔LAC 16,S16↔RET2]
;FOREACH V|BV⊗B≡V DO
LAC V,B
L2: PVT V,V
TEST V,VBIT↔GO L1
;TRANSLATE TO CAMERA LOCUS.
LAC X,XWC(V)↔FSBR X,XWC(C)
LAC Y,YWC(V)↔FSBR Y,YWC(C)
LAC Z,ZWC(V)↔FSBR Z,ZWC(C)
;ROTATE TO CAMERA ORIENTATION.
DEFINE ROTATE $(QQ,Q){
LAC QQ,X↔ FMPR QQ,Q$X(C)
LAC Y↔ FMPR Q$Y(C)↔ FADR QQ,
LAC Z↔ FMPR Q$Z(C)↔ FADR QQ,}
ROTATE(XX,I);
ROTATE(YY,J);
ROTATE(ZZ,K);
;PERSPECTIVE TRANSFORMATION.
FMPR XX,SCALEX↔ FDVR XX,ZZ↔ DAC XX,XPP(V)
FMPR YY,SCALEY↔ FDVR YY,ZZ↔ DAC YY,YPP(V)
MOVN Z,SCALEZ↔ FDVR Z,ZZ↔ DAC Z,ZPP(V)
;PROJECTOR(CAMERA,WORLD) CONTINUED.
;DO Z-CLIP MARKING WRT CAMERA CENTERED COORDINATES.
SLIMZ X,(PZZ∨NZZ)↔ANDCAM X,(V)
SLIMZ X,(PZZ); POSITIVE HALFSPACE BEHIND THE CAMERA.
MOVN FOCAL
CAMGE ZZ,0; SKIP WHEN Zcc ≥ -FOCAL.
SLIMZ X,(NZZ); OTHERWISE NEGATIVE CAMERA HALFSPACE INVIEW.
IORM X,(V)
PED E,V
LAC E0,E
JUMPE E,[PFACE F,B↔IORM X,(F)↔GO L1] ;VERTEX BODY CASE.
L3: IORM X,(E)
SETQ(F,{FCCW,E,V})
IORM X,(F)
SETQ(E,{ECCW,E,V})
CAME E,E0
GO L3
GO L2
BEND
;UNPROJECT(V)
SUBR(UNPROJECT)
BEGIN
ACCUMULATORS{V,C,X,Y,Z,XX,YY,ZZ}
LAC V,ARG1
LAC C,CAMLOCOR
;UNDO PERSPECTIVE.
LACN Z,SCALEZ↔FDVR Z,ZPP(V)
LAC Y,YPP(V)↔FMPR Y,Z↔FDVR Y,SCALEY
LAC X,XPP(V)↔FMPR X,Z↔FDVR X,SCALEX
;ROTATE BY TRANSPOSE OF CAMERA ORIENTATION.
LAC XX,X↔FMPR XX,IX(C)
LAC Y↔FMPR JX(C)↔FADR XX,
LAC Z↔FMPR KX(C)↔FADR XX,
LAC YY,Y↔FMPR YY,IY(C)
LAC Y↔FMPR JY(C)↔FADR YY,
LAC Z↔FMPR KY(C)↔FADR YY,
LAC ZZ,Z↔FMPR ZZ,IZ(C)
LAC Y↔FMPR JZ(C)↔FADR ZZ,
LAC Z↔FMPR KZ(C)↔FADR ZZ,
;TRANSLATE TO CAMERA LOCUS.
FADR XX,XWC(C)↔DAC XX,XWC(V)
FADR YY,YWC(C)↔DAC YY,YWC(V)
FADR ZZ,ZWC(C)↔DAC ZZ,ZWC(V)
RET1
BEND
;FACOEF(B,FLG).
SUBR(FACOEF)
BEGIN FACOEF
ACCUMULATORS {Q,E,V1,V2,V3,ABC,F,ARG}
EXTERN SQRT;CLOBBERS AC1 THRU AC4.
FOR @% Qε{XYZ}{FOR @$ N←1,3{
DEFINE Q%$N<Q%WC(V$N)>↔}}
;FOREACH F|BF⊗B≡F.
LAC F,ARG2
LAC ARG,(F) ;ORIGINAL ARG TYPE.
TLNN ARG,(BBIT)↔GO L2
L1: PFACE F,F
TEST F,FBIT↔RET2
;FIRST THREE VERTICES CCW ABOUT THE FACE.
L2: PED E,F
SETQ(V1,{VCW,E,F})
SETQ(V2,{VCCW,E,F})
SETQ(E,{ECCW,E,F})
SETQ(V3,{VCCW,E,F})
;FLG TRUE FOR PERSPECTIVE PROJECTED FACOEF.
SKIPE ARG1
GO[ADDI V1,7↔ADDI V2,7↔ADDI V3,7↔GO .+1]
;KK(F) ← X1*(Z2*Y3-Y2*Z3) + Y1*(X2*Z3-Z2*X3) + Z1*(Y2*X3-X2*Y3).
LAC 1,Z2↔FMPR 1,Y3↔LAC Y2↔FMPR Z3↔FSBR 1,0↔FMPR 1,X1
LAC 2,X2↔FMPR 2,Z3
LAC Z2↔FMPR X3↔FSBR 2,0↔FMPR 2,Y1↔FADR 1,2
LAC 3,Y2↔FMPR 3,X3
LAC X2↔FMPR Y3↔FSBR 3,0↔FMPR 3,Z1↔FADR 1,3
DAC 1,KK(F)
;AA(F) ← (Z1*(Y2-Y3) + Z2*(Y3-Y1) + Z3*(Y1-Y2)).
LAC 1,Y2↔FSBR 1,Y3↔FMPR 1,Z1↔LAC 0,1
LAC 1,Y3↔FSBR 1,Y1↔FMPR 1,Z2↔FADR 0,1
LAC 1,Y1↔FSBR 1,Y2↔FMPR 1,Z3↔FADR 0,1
DAC AA(F)↔FMPR↔DAC ABC
;BB(F) ← (X1*(Z2-Z3) + X2*(Z3-Z1) + X3*(Z1-Z2)).
LAC 1,Z2↔FSBR 1,Z3↔FMPR 1,X1↔LAC 0,1
LAC 1,Z3↔FSBR 1,Z1↔FMPR 1,X2↔FADR 0,1
LAC 1,Z1↔FSBR 1,Z2↔FMPR 1,X3↔FADR 0,1
DAC BB(F)↔FMPR↔FADRM ABC
;CC(F) ← (X1*(Y3-Y2) + X2*(Y1-Y3) + X3*(Y2-Y1)).
LAC 1,Y3↔FSBR 1,Y2↔FMPR 1,X1↔LAC 0,1
LAC 1,Y1↔FSBR 1,Y3↔FMPR 1,X2↔FADR 0,1
LAC 1,Y2↔FSBR 1,Y1↔FMPR 1,X3↔FADR 0,1
DAC CC(F)↔FMPR↔FADRM ABC
;NORMALIZE.
PUSH P,ABC↔PUSHJ P,SQRT↔SLIMZ(<1.0>)↔FDVR 1
FMPRM AA(F)↔FMPRM BB(F)↔FMPRM CC(F)↔FMPRM KK(F)
TLNN ARG,(BBIT)↔RET2↔GO L1
BEND
;ZCLIPF(F0)
SUBR ZCLIPF
BEGIN ZCLIPF
GO L0
DECLARE{F,E,V,V1,V2,U0,U1,U2,ENEW,F0}
EXTERN MKFE,ESPLIT
;GET A PZZ VERTEX OF F0
L0: LAC 1,ARG1
DAC 1,F0↔DAC 1,U1↔DAC 1,F
PED 0,1↔DAC E
L1: SETQ(E,{ECCW,E,F})
SETQ(V,{VCCW,E,F})
TEST 1,PZZ↔GO L1
;GET FIRST NZZ VERTEX CCW AROUND F FROM E.
L2: SETQ(E,{ECCW,E,F})
SETQ(V,{VCCW,E,F})
TEST 1,NZZ↔GO L2
;MAKE Z-CLIP VERTEX.
LAC 1,E↔PVT 0,1↔CAMN 0,V↔GO .+3↔CALL INVERT,E
PVT 0,1↔DAC V1
NVT 0,1↔DAC V2
SETQ(U2,{ESPLIT,E})
LAC 1,U2↔MARK 1,TEMPORARY
CALL ZCLIP,V1,U2,V2
CALL UNPROJECT,U2
LAC 1,U2↔MARK 1,NZZ
;MAKE Z-CLIP EDGE.
L3: LAC 1,U1↔TEST 1,VBIT↔GO L4
SETQ(ENEW,{MKFE,U1,F,U2})
LAC 2,ENEW↔NFACE 1,2
MARK 1,PZZ
MARK 2,TEMPORARY
LAC 1,F↔MARKZ 1,PZZ
MARK 1,NZZ
CAMN 1,F0↔RET1; .......EXIT.
NFACE 1,2↔DAC 1,F
MARK 1,PZZ
GO .+3
L4: LAC U2↔DAC U0
;ADVANCE INTO THE NEXT FACE.
LAC U2↔DAC U1
SETQ(F,{OTHER,E,F})
CAME 1,F0↔GO L2
LAC U0↔DAC U2↔GO L3
BEND
;FMARK(WORLD) - MARK POTENT FACES FOR OCCULT.
SUBR(FMARK)
BEGIN FMARK
ACCUMULATORS{W,B,F,Q,R}
;INITIALIZE THE FOUR RINGS OF THE OCCULT.
LAC 1,ARG1↔SLAP 1,1
DAC 1,5(1)↔DAC 1,8(1)
DAC 1,9(1)↔DAC 1,12(1)
;FOREACH B|BεWORLD DO
LAC B,ARG1↔DAC B,BODY#
L1: LAC B,BODY↔PBODY B,B↔DAC B,BODY
TEST B,BBIT↔RET1
;FOREACH F|BF⊗B≡F DO
LAC F,B
L2: PFACE F,F↔DAC F,FACE#
TEST F,FBIT↔GO L1
HIDE F
TEST F,NZZ↔GO L2
TEST F,PZZ↔GO L3
CALL ZCLIPF,F
LAC F,FACE
L3: SETOM↔CALL(FACOEF,F,0)
LAC F,FACE
LAC CC(F)↔FMPR LDZ
CAML KK(F)↔GO L2
;POTENTIALLY VISIBLE FACE.
L4: MARK F,POTENT
CDR R,ARG1↔CAR Q,5(R); THE POTNTF RING.
DAP F,5(Q)↔DIP F,5(R)
DIP Q,5(F)↔DAP R,5(F)
GO L2
BEND
;EMARK(WORLD) - MARK POTENT EDGES FOR OCCULT.
SUBR(EMARK)
BEGIN EMARK
ACCUMULATORS{Q,R,S,B,F1,F2,E}
ACCUMULATORS{V1,V2}
EXTERN INVERT,SQRT
;FOREACH B|BεWORLD DO
LAC B,ARG1
L1: PBODY B,B
TEST B,BBIT↔RET1
;FOREACH E|BE⊗B≡E DO
LAC E,B
L2: PED E,E
TEST E,EBIT↔GO L1
MARKZ E,7B13
PFACE F1,E
NFACE F2,E
;WHEN EITHER FACE IS POTENT THEN THE EDGE IS POTENT.
LAC(F1)↔IOR(F2)↔TLNN(POTENT)↔GO L2
MARK E,POTENT
CDR R,ARG1↔CAR Q,8(R); THE POTNTE RING.
DAP E,8(Q)↔DIP E,8(R)
DIP Q,8(E)↔DAP R,8(E)
;COMPUTE NORMALIZED EDGE COEFFICIENTS.
NVT V1,E↔PVT V2,E↔MARK V1,POTENT↔MARK V2,POTENT
LAC YPP(V2)↔FSBR YPP(V1)↔DAC AA(E)↔FMPR↔DAC 1
LAC XPP(V1)↔FSBR XPP(V2)↔DAC BB(E)↔FMPR↔FADR 1,0
LAC XPP(V2)↔FMPR YPP(V1)
LAC S,XPP(V1)↔FMPR S,YPP(V2)
FSBR S↔DAC CC(E)
PUSH P,1↔PUSHJ P,SQRT;CLOBBERS AC1 THRU AC4.
SLIMZ(<1.0>)↔FDVR 0,1
FMPRM AA(E)↔FMPRM BB(E)↔FMPRM CC(E)
;WHEN ONLY ONE FACE IS POTENT THEN EDGE IS FOLDED.
LAC(F1)↔XOR(F2)↔TLNN(POTENT)↔GO L2
TEST F1,POTENT↔GO[CALL INVERT,E↔GO .+1];NOTA BENE !
MARK E,FOLDED
CDR R,ARG1↔CAR Q,9(R); THE FOLDE RING.
DAP E,9(Q)↔DIP E,9(R)
DIP Q,9(E)↔DAP R,9(E)
GO L2
BEND
;EMARKALL(WORLD) - MARK ALL EDGES POTENT.
SUBR(EMARKALL)
BEGIN EMARKALL
ACCUMULATORS{B,E}
;FOREACH B|BεWORLD DO
LAC B,ARG1
L1: PBODY B,B
TEST B,BBIT↔RET1
;FOREACH E|BE⊗B≡E DO
LAC E,B
L2: PED E,E
TEST E,EBIT↔GO L1
MARK E,POTENT↔GO L2
BEND
;VMARK(OWINDO,WORLD) - MARK THE NSEW BIT OF ALL THE VERTICES.
VMARK: 0
BEGIN VMARK
ACCUMULATORS{B,E,V,X,Y}
;GET THE OWINDO.
LAC 1,ARG2
LAC 1(1)↔DAC XL↔LAC 2(1)↔DAC XH
LAC 3(1)↔DAC YL↔LAC 4(1)↔DAC YH
LAC -2(1)↔DAC SOX↔LAC -1(1)↔DAC SOY
LAC 7(1)↔DAC MAGX↔LAC 8(1)↔DAC MAGY
;FOREACH B|BεWORLD DO
LAC B,ARG1
L1: PBODY B,B
TEST B,BBIT↔GO @VMARK
;FOREACH V|BV⊗B≡V DO
LAC V,B
L2: PVT V,V
TEST V,VBIT↔GO L1
;COMPUTE DISPLAY COORDINATES OF THE VERTEX.
LAC X,XPP(V)↔FMPR X,MAGX↔FADR X,SOX↔XDC. X,V↔HLLES X
LAC Y,YPP(V)↔FMPR Y,MAGY↔FADR Y,SOY↔YDC. Y,V↔HLLES Y
;DO XY-CLIP MARKING.
TYPE 0,V↔TRZ(NSEW);NSEW RESET.
CAMLE Y,YH↔TRO(NORTH)
CAMGE Y,YL↔TRO(SOUTH)
CAMLE X,XH↔TRO(EAST)
CAMGE X,XL↔TRO(WEST)
TYPE. 0,V
GO L2
BEND
;SUBR ZCLIP(V1,U,V2).
SUBR(ZCLIP)
BEGIN ZCLIP
F←0 ↔ U←1
ACCUMULATORS{V1,V2,X1,Y1,Z1,X2,Y2,Z2}
SAVAC(11)
;V1 BEHIND CAMERA PLANE, V2 VEFORE CAMERA PLANE.
CDR V1,ARG3
CDR U,ARG2
CDR V2,ARG1
LAC F,FOCAL
;UNPROJECT TO CAMERA CENTERED COORDINATES.
FOR @$ I←1,2{
MOVN Z$I,SCALEZ↔ FDVR Z$I,ZPP(V$I)
LAC Y$I,Z$I↔ FMPR Y$I,YPP(V$I)↔ FDVR Y$I,SCALEY
LAC X$I,Z$I↔ FMPR X$I,XPP(V$I)↔ FDVR X$I,SCALEX}
;PIERCE Z=-FOCAL PLANE BY SIMILAR TRIANGLES & REPROJECT.
FSBR X1,X2↔ FSBR Y1,Y2↔ FSBR Z1,Z2
FADR Z2,F↔MOVNS Z2
FMPR X1,Z2↔ FDVR X1,Z1↔FADR X1,X2
FMPR X1,SCALEX↔FDVR X1,F↔ DACN X1,XPP(U)
FMPR Y1,Z2↔ FDVR Y1,Z1↔FADR Y1,Y2
FMPR Y1,SCALEY↔FDVR Y1,F ↔ DACN Y1,YPP(U)
LAC 2,SCALEZ↔ FDVR 2,F↔ DAC 2,ZPP(U)
;MARK U'S NSEW BITS.
ACCUMULATORS{XX,YY}
LAC XX,XPP(U)↔FMPR XX,MAGX↔FADR XX,SOX↔XDC. XX,U↔HLLES
LAC YY,YPP(U)↔FMPR YY,MAGY↔FADR YY,SOY↔YDC. YY,U↔HLLES
TYPE 0,U↔TRZ(NSEW);NSEW RESET.
CAMLE YY,YH↔TRO(NORTH)
CAMGE YY,YL↔TRO(SOUTH)
CAMLE XX,XH↔TRO(EAST)
CAMGE XX,XL↔TRO(WEST)
TRZ(PZZ)↔TRO(NZZ)
TYPE. 0,U
GETAC(11)
RET3
BEND
;XY-CLIPPER, SKIPS WHEN PORTION IS VISIBLE.
;EXPECTS ACCUMULATORS TO BE INITIALIZED.
BEGIN XYCLIP
ACCUMULATORS{E,V1,V2,X1,Y1,X2,Y2,PTR}
DECLARE{A,B,C,FLGO,FLGZ,AXH,AXL,BYH,BYL,QNE,QNW,QSW,QSE}
↑XYCLIP: 0
;GET NSEW BITS.
LDB 0,[POINT 4,(V1),8];
LDB 1,[POINT 4,(V2),8];
;EASY OUTSIDER EDGE.
TRNE 0,(1)↔GO @XYCLIP
;GET ENDS' LOCII.
XDC X1,V1↔YDC Y1,V1
XDC X2,V2↔YDC Y2,V2
;EASY INSIDER VERTICES.
JUMPE 0,[LAC X1↔FIXX↔DIP(PTR)↔
LAC Y1↔FIXX↔DAP(PTR)↔AOBJN PTR,.+1]
JUMPE 1,[LAC X2↔FIXX↔DIP(PTR)↔
LAC Y2↔FIXX↔DAP(PTR)↔AOBJN PTR,.+1↔GO L]
;COMPUTE EDGE COEFFICIENTS.
LAC Y1↔FSBR Y2↔DAC A
LAC X2↔FSBR X1↔DAC B
LAC X2↔FMPR Y1↔MOVNM C
LAC X1↔FMPR Y2↔FADRM C
;PARTIAL PRODUCTS.
LAC A↔FMPR XH↔DAC AXH
LAC A↔FMPR XL↔DAC AXL
LAC B↔FMPR YH↔DAC BYH
LAC B↔FMPR YL↔DAC BYL
;CORNER Q'S.
SETOM FLGO↔SETZM FLGZ
LAC AXH↔FADR BYH↔FADR C↔DAC QNE↔ANDM FLGO↔IORM FLGZ
LAC AXL↔FADR BYH↔FADR C↔DAC QNW↔ANDM FLGO↔IORM FLGZ
LAC AXL↔FADR BYL↔FADR C↔DAC QSW↔ANDM FLGO↔IORM FLGZ
LAC AXH↔FADR BYL↔FADR C↔DAC QSE↔ANDM FLGO↔IORM FLGZ
;HARD OUTSIDER CASES.
SKIPGE FLGO↔GO @XYCLIP
SKIPL FLGZ↔GO @XYCLIP
;XY-CLIPPER continued.
;NORTH BORDER CROSSING.
LAC QNE↔XOR QNW↔SKIPL↔GO L2
LAC Y1↔CAMGE Y2↔LAC Y2↔CAMG YH↔GO L2
LAC BYH↔FADR C↔MOVNS↔FDVR A↔FIXX↔DIP(PTR)
LAC YH↔FIXX↔DAP(PTR)
AOBJN PTR,.+2↔GO L
;SOUTH BORDER CROSSING.
L2: LAC QSE↔XOR QSW↔SKIPL↔GO L3
LAC Y1↔CAMLE Y2↔LAC Y2↔CAML YL↔GO L3
LAC BYL↔FADR C↔MOVNS↔FDVR A↔FIXX↔DIP(PTR)
LAC YL↔FIXX↔DAP(PTR)
AOBJN PTR,.+2↔GO L
;EAST BORDER CROSSING.
L3: LAC QSE↔XOR QNE↔SKIPL↔GO L4
LAC X1↔CAMGE X2↔LAC X2↔CAMG XH↔GO L4
LAC XH↔FIXX↔DIP(PTR)
LAC AXH↔FADR C↔MOVNS↔FDVR B↔FIXX↔DAP(PTR)
AOBJN PTR,.+2↔GO L
;WEST BORDER CROSSING.
L4: LAC QSW↔XOR QNW↔SKIPL↔GO L5
LAC X1↔CAMLE X2↔LAC X2↔CAML XL↔GO L5
LAC XL↔FIXX↔DIP(PTR)
LAC AXL↔FADR C↔MOVNS↔FDVR B↔FIXX↔DAP(PTR)
AOBJN PTR,.+2↔GO L
;STRANGE EXIT - VMARK & ECOEF ARE INCONSISTENT.
L5: OUTSTR[ASCIZ/XY-CLIPPER FALL THRU !
/]↔ GO @XYCLIP
;VISIBLE PORTION EXIT.
L: AOS XYCLIP
GO @XYCLIP
LIT
BEND
;END OF XY-CLIPPER.
; CNT,,"nbody" ELIST ← CLIPER(OWINDO,WORLD);
SUBR(CLIPER)
BEGIN CLIPER
ACCUMULATORS{E,V1,V2,X1,Y1,X2,Y2,PTR,S12,B,LINK}
JSR VMARK
SETZM CNT#↔SETZ LINK,;NIL OF THE LIST.
;FOREACH B|BεWORLD DO
LAC B,ARG1
L1: PBODY B,B
TEST B,BBIT↔GO[SLAP LINK,CNT↔RET2(LINK)];
;FOREACH E|BE⊗B≡E DO
LAC E,B
L2: PED E,E
TEST E,EBIT↔GO L1
TESTZ E,DARKEN↔GO L2
TEST E,VISIBLE∨POTENT↔GO L2
;GET THE ENDS.
PVT V1,E↔NVT V2,E↔LIMZ PTR,U
;DOES EDGE NEED Z-CLIPPING.
LDB 1,[POINT 2,(E),10];PICKUP PZZ/NZZ.
SLIMZ(PZZ∨NZZ)↔ANDCAM(E);CLEAR 'EM.
GO .+1(1); PZZ,NZZ
JFCL; 0,0 - EDGE AIN'T MARKED.
GO L3; 0,1 - INVIEW HALFSPACE.
GO L4; 1,0 - OUT'A'SIGHT HALFSPACE.
;1,1 - NEEDS Z-CLIPPING.
;GET THE ONE INVIEW TO BE V2.
TEST V2,NZZ
EXCH V1,V2
;CALL SUB-CLIPPER-ROUTINES.
SETQ(V1,{ZCLIP,V1,PTR,V2})
L3: SLIMZ PTR,-2↔LIM PTR,8(E)
JSR XYCLIP
GO [L4: MARKZ E,VISIBLE↔GO L2]
;CONS EDGE INTO VISIBLE EDGE LIST.
AOS CNT#
MARK E,VISIBLE
NBODY. LINK,E
LAC LINK,E
GO L2
;PSEUDO VERTEX FOR Z-CLIPPER.
LIT↔VAR
0↔0↔0↔U: BLOCK 9
BEND
END